home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Diamond Collection / The Diamond Collection (Software Vault)(Digital Impact).ISO / cdr44 / 2m30src.zip / 2M-INF.ASM < prev    next >
Assembly Source File  |  1995-03-06  |  59KB  |  1,303 lines

  1.  
  2. ;┌───────────────────────────────────────────────────────────────────┐
  3. ;│                                                                   │
  4. ;│               RUTINAS EN ENSAMBLADOR PARA 2M-INFO                 │
  5. ;│                                                                   │
  6. ;│          Incluir en un fichero de proyecto con 2M-INFO.C          │
  7. ;│         El modelo de memoria debe ser necesariamente LARGE        │
  8. ;│                                                                   │
  9. ;└───────────────────────────────────────────────────────────────────┘
  10.  
  11.                PUBLIC    _vgahi256     ; inicializar modo 320x400x256
  12.                PUBLIC    _setpix       ; trazar puntos
  13.                PUBLIC    _getpix       ; obtener color de un punto
  14.                PUBLIC    _showpage     ; elegir página a mostrar
  15.                PUBLIC    _setpage      ; página para setpix y getpix
  16.                PUBLIC    _FuenteInfo   ; puntero juego caracteres 8*16
  17.                PUBLIC    _segvideo     ; segmento de vídeo activo
  18.                PUBLIC    _prcar        ; escribir carácter
  19.                PUBLIC    _PintaBitMap  ; imprimir mapa de bits
  20.                PUBLIC    _set80x30     ; modo texto VGA 80x30 (font 8x16)
  21.                PUBLIC    _ResetVideo   ; Reset del modo de vídeo
  22.                PUBLIC    _ptecla       ; introducir tecla en el buffer
  23.                PUBLIC    _rnd          ; obtener número aleatorio
  24.                PUBLIC    _semilla      ; para números aleatorios
  25.                PUBLIC    _EsperaDma0   ; esperar cuenta 0xFFFF del DMA
  26.                PUBLIC    _es386        ; detectar 386+
  27.                PUBLIC    _NuevaInt24   ; nuevo gestor errores críticos
  28.                PUBLIC    _tiempo       ; devolver «hora» exacta
  29.  
  30.  
  31. _TEXT          SEGMENT WORD PUBLIC 'CODE'
  32.                ASSUME  CS:_TEXT, DS:_DATA
  33.  
  34. ; ------------ Establecer el modo 320x400x256 no soportado por la BIOS
  35. ;              Declaración:  void vgahi256 (void);
  36.  
  37. _vgahi256      PROC  FAR
  38.                PUSH  ES
  39.                PUSH  SI
  40.                PUSH  DI
  41.  
  42.                PUSH  DS
  43.                MOV   AX,40h
  44.                MOV   DS,AX
  45.                MOV   AL,DS:[10h]
  46.                AND   AL,0CFh           ; por si estamos en modo 7...
  47.                OR    AL,20h
  48.                MOV   DS:[10h],AL       ; ...forzar modo de color
  49.                POP   DS
  50.  
  51.                MOV   AX,13h            ; establecer modo 13h
  52.                INT   10h
  53.  
  54.                CLI                     ; *
  55.                MOV   DX,3CEH           ; desconectar división de las
  56.                MOV   AL,5              ; direcciones de memoria en el
  57.                OUT   DX,AL             ; registro de modo
  58.                INC   DX
  59.                IN    AL,DX
  60.                AND   AL,11101111b
  61.                OUT   DX,AL
  62.                DEC   DX
  63.                MOV   AL,6              ; y en el registro misceláneo
  64.                OUT   DX,AL
  65.                INC   DX
  66.                IN    AL,DX
  67.                AND   AL,11111101b
  68.                OUT   DX,AL
  69.                MOV   DX,3C4h           ; modificar el registro de modo
  70.                MOV   AL,4              ; de memoria en el secuenciador
  71.                OUT   DX,AL             ; para que no divida las
  72.                INC   DX                ; direcciones en varios
  73.                IN    AL,DX             ; planos de bit y determine el
  74.                AND   AL,11110111b      ; plano actual mediante el
  75.                OR    AL,4              ; registro de máscara de bit
  76.                OUT   DX,AL
  77.                STI                     ; *
  78.  
  79.                PUSH  ES
  80.                MOV   ES,_segvideo      ; rellenar los cuatro planos
  81.                XOR   DI,DI             ; de bit con 0 para borrar la
  82.                MOV   AX,DI             ; pantalla
  83.                DEC   AX
  84.                MOV   CX,8000h
  85.                REP   STOSW             ; cld/std indiferente
  86.                POP   ES
  87.  
  88.                CLI                     ; *
  89.                MOV   DX,3D4h           ; Desconectar la duplicación de
  90.                MOV   AL,9              ; las líneas en el registro
  91.                OUT   DX,AL             ; maximum-Scan-Line del CRT
  92.                INC   DX                ; y ajustar la altura de los
  93.                IN    AL,DX             ; caracteres a 1
  94.                AND   AL,01110000b
  95.                OUT   DX,AL
  96.                DEC   DX
  97.                MOV   AL,14h            ; desconectar modo Double-Word
  98.                OUT   DX,AL
  99.                INC   DX
  100.                IN    AL,DX
  101.                AND   AL,10111111b
  102.                OUT   DX,AL
  103.                DEC   DX
  104.                MOV   AL,17h            ; cambiar del modo Word al modo
  105.                OUT   DX,AL             ; byte mediante el registro de
  106.                INC   DX                ; de control de modo del CRT
  107.                IN    AL,DX
  108.                OR    AL,01000000b
  109.                OUT   DX,AL
  110.                STI                     ; *
  111.                POP   DI
  112.                POP   SI
  113.                POP   ES
  114.                RET
  115. _vgahi256      ENDP
  116.  
  117.  
  118. ; ------------ Pintar un punto en el modo 320x400x256.
  119. ;              Declaración: void setpix (int x, int y, int color);
  120.  
  121. x0             EQU   [BP+6]            ; para modelo LARGE
  122. y0             EQU   [BP+8]
  123. color          EQU   [BP+10]
  124.  
  125. _setpix        PROC  FAR
  126.                PUSH  BP
  127.                MOV   BP,SP
  128.                PUSH  DS
  129.                PUSH  DI
  130.                MOV   AX,320/4          ; calcular offset en VRAM
  131.                MUL   WORD PTR y0
  132.                MOV   CX,x0
  133.                MOV   DI,CX
  134.                SHR   DI,1
  135.                SHR   DI,1
  136.                ADD   DI,AX             ; offset en DI
  137.                AND   CL,3              ; calcular máscara para el
  138.                MOV   AH,1              ; mapa a direccionar en AH
  139.                SHL   AH,CL
  140.                MOV   AL,2              ; a AL el número de registro
  141.                MOV   DX,3C4h
  142.                OUT   DX,AX             ; cargar registro de máscara
  143.                MOV   AL,color
  144.                MOV   DS,_segvideo      ; DS -> VRAM
  145.                MOV   [DI],AL           ; trazar punto
  146.                POP   DI
  147.                POP   DS
  148.                POP   BP
  149.                RET
  150. _setpix        ENDP
  151.  
  152. ; ------------ Obtener el color de un punto en el modo 320x400x256.
  153. ;              Declaración: int getpix (int x, int y);
  154.  
  155. x1             EQU   [BP+6]            ; para modelo LARGE
  156. y1             EQU   [BP+8]
  157.  
  158. _getpix        PROC  FAR
  159.                PUSH  BP
  160.                MOV   BP,SP
  161.                PUSH  DS
  162.                PUSH  SI
  163.                MOV   AX,320/4          ; calcular offset en VRAM
  164.                MUL   WORD PTR y1
  165.                MOV   SI,x1
  166.                MOV   CX,SI
  167.                SHR   SI,1
  168.                SHR   SI,1
  169.                ADD   SI,AX
  170.  
  171.                AND   CL,3              ; calcular máscara para el
  172.                MOV   AH,CL             ; mapa a direccionar en AH
  173.                MOV   AL,4
  174.                MOV   DX,3CEh
  175.                OUT   DX,AX             ; cargar registro Read-Map
  176.  
  177.                MOV   DS,_segvideo      ; DS -> VRAM
  178.                MOV   AL,[SI]           ; obtener color del punto
  179.                MOV   AH,0              ; (int)
  180.                POP   SI
  181.                POP   DS
  182.                POP   BP
  183.                RET
  184. _getpix        ENDP
  185.  
  186.  
  187. ; ------------ Selecciona la página de trabajo para setpix/getpix.
  188. ;              Declaración: void setpage (int pagina);
  189.  
  190. pags           EQU   [BP+6]            ; para modelo LARGE
  191.  
  192. _setpage       PROC  FAR
  193.                PUSH  BP
  194.                MOV   BP,SP
  195.                MOV   AX,0A000h
  196.                CMP   WORD PTR pags,0
  197.                JE    sp_ok
  198.                MOV   AX,0A800h
  199. sp_ok:         MOV   _segvideo,AX      ; nueva dirección de vídeo
  200.                POP   BP
  201.                RET
  202. _setpage       ENDP
  203.  
  204.  
  205. ; ------------ Selecciona la página de trabajo visualizada.
  206. ;              Declaración: void showpage (int pagina);
  207.  
  208. pagv           EQU   [BP+6]            ; para modelo LARGE
  209.  
  210. _showpage      PROC  FAR
  211.                PUSH  BP
  212.                MOV   BP,SP
  213.                MOV   AX,pagv
  214.                AND   AL,AL             ; ¿página 0?
  215.                JZ    wp_ok             ; así es
  216.                MOV   AL,80h            ; página 1, con offset 8000h
  217. wp_ok:         MOV   DX,3D4h           ; direccionar CRT
  218.                MOV   AH,AL             ; byte alto del offset a AH
  219.                MOV   AL,0Ch
  220.                OUT   DX,AX
  221.                MOV   DX,3DAh
  222.                PUSH  DS
  223.                MOV   AX,40h
  224.                MOV   DS,AX
  225.                MOV   CX,9              ; timeout de 0.5 segundos
  226.                MOV   AH,DS:[6Ch]
  227. frt_vert:      CMP   AH,DS:[6Ch]
  228.                JNE   frt_nvert
  229.                IN    AL,DX             ; esperar primero final del
  230.                TEST  AL,8              ; retrazado vertical
  231.                JNZ   frt_vert
  232.                JMP   irt_vert
  233. frt_nvert:     MOV   AH,DS:[6Ch]
  234.                LOOP  frt_vert
  235.                JMP   fin_shw           ; no llega el retrazo
  236. irt_vert:      CMP   AH,DS:[6Ch]
  237.                JNE   irt_nvert
  238.                IN    AL,DX             ; esperar inicio del
  239.                TEST  AL,8              ; retrazado vertical
  240.                JZ    irt_vert
  241.                JMP   fin_shw
  242. irt_nvert:     MOV   AH,DS:[6Ch]
  243.                LOOP  irt_vert
  244. fin_shw:       POP   DS
  245.                POP   BP
  246.                RET
  247. _showpage      ENDP
  248.  
  249.  
  250. ; ------------ Imprimir carácter de la fuente.
  251. ;              Declaración: void prcar (int car, int x, int y, int largo,
  252. ;                             int alto, int tinta, int papel, int pitch);
  253.  
  254. car            EQU   [BP+6]            ; para modelo LARGE
  255. c_x            EQU   [BP+8]
  256. c_y            EQU   [BP+10]
  257. largo          EQU   [BP+12]
  258. alto           EQU   [BP+14]
  259. tinta          EQU   [BP+16]
  260. papel          EQU   [BP+18]
  261. pitch          EQU   [BP+20]
  262.  
  263. _prcar         PROC  FAR
  264.                PUSH  BP
  265.                MOV   BP,SP
  266.                PUSH  ES
  267.                PUSH  SI
  268.                PUSH  DI
  269.                MOV   AX,320/4          ; calcular offset en VRAM
  270.                MUL   WORD PTR c_y
  271.                MOV   DI,c_x
  272.                SHR   DI,1
  273.                SHR   DI,1
  274.                ADD   DI,AX
  275.                MOV   ES,_segvideo      ; ES:DI -> VRAM
  276.                MOV   AL,car
  277.                MOV   AH,0
  278.                MOV   CL,4
  279.                SHL   AX,CL             ; carácter * 16
  280.                ADD   AX,OFFSET _FuenteInfo
  281.                MOV   SI,AX             ; SI -> fuente
  282.                MOV   CX,c_x
  283.                AND   CL,3              ; calcular máscara para el
  284.                MOV   BH,00010001b      ; mapa a direccionar en BH
  285.                ROL   BH,CL
  286.                MOV   BL,10000000b      ; pixel en curso en BL
  287.  
  288.                MOV   CX,8
  289. pr_horiz:      PUSH  CX
  290.  
  291.                MOV   CX,largo
  292. pr_duphoriz:   PUSH  CX
  293.                PUSH  SI
  294.                PUSH  DI
  295.  
  296.                MOV   AL,2              ; a AL el número de registro
  297.                MOV   AH,BH
  298.                MOV   DX,3C4h
  299.                OUT   DX,AX             ; cargar registro de máscara
  300.  
  301.                MOV   AH,tinta          ; tinta inicial
  302.  
  303.                MOV   DX,16
  304. pr_vert:
  305.                MOV   AL,AH             ; tinta en curso
  306.                TEST  [SI],BL
  307.                JNZ   pr_tin
  308.                MOV   AL,papel
  309.                CMP   AL,0FFh
  310.                JNE   pr_pap
  311.  
  312.                MOV   CX,alto
  313.                PUSH  BX
  314.                MOV   BL,AH
  315.                SHL   BX,1
  316. pr_nulvert:    ADD   DI,80             ; siguiente línea
  317.                ADD   BX,pitch
  318.                LOOP  pr_nulvert
  319.                SHR   BX,1
  320.                MOV   AH,BL
  321.                POP   BX
  322.                JMP   pr_otrop
  323.  
  324. pr_pap:        MOV   CX,alto
  325.                PUSH  BX
  326.                MOV   BL,AH
  327.                SHL   BX,1
  328. pr_papvert:    MOV   ES:[DI],AL        ; trazar punto de papel
  329.                ADD   DI,80             ; siguiente línea
  330.                ADD   BX,pitch
  331.                LOOP  pr_papvert
  332.                SHR   BX,1
  333.                MOV   AH,BL
  334.                POP   BX
  335.                JMP   pr_otrop
  336.  
  337. pr_tin:        MOV   CX,alto
  338.                PUSH  BX
  339.                MOV   BL,AL
  340.                SHL   BX,1
  341. pr_tinvert:    MOV   ES:[DI],AL        ; trazar punto de tinta
  342.                ADD   DI,80             ; siguiente línea
  343.                ADD   BX,pitch
  344.                MOV   AX,BX
  345.                SHR   AX,1
  346.                LOOP  pr_tinvert
  347.                MOV   AH,AL
  348.                POP   BX
  349.  
  350. pr_otrop:      INC   SI                ; siguiente scan
  351.  
  352.                DEC   DX
  353.                JNZ   pr_vert
  354.  
  355.                POP   DI
  356.                POP   SI
  357.  
  358.                ROL   BH,1              ; siguiente mapa de bits
  359.                JNC   pr_np
  360.                INC   DI                ; siguiente dirección VRAM
  361. pr_np:
  362.                POP   CX
  363.                LOOP  pr_duphoriz
  364.  
  365.                ROR   BL,1              ; siguiente pixel
  366.                POP   CX
  367.                DEC   CX
  368.                JZ    pr_ex
  369.  
  370.                JMP   pr_horiz
  371.  
  372. pr_ex:         POP   DI
  373.                POP   SI
  374.                POP   ES
  375.                POP   BP
  376.                RET
  377. _prcar         ENDP
  378.  
  379.  
  380. ; ------------ Imprimir mapa de bits.
  381. ;              Declaración: void PintaBitMap (char *bitmap, int ancho,
  382. ;                                            int relx, int rely, int lx,
  383. ;                                            int ly, int x, int y, int modo);
  384.  
  385. bitmap         EQU   [BP+6]            ; para modelo LARGE
  386. ancho          EQU   [BP+10]
  387. relx           EQU   [BP+12]           ; coordenadas relativas sobre
  388. rely           EQU   [BP+14]           ; el propio bitmap
  389. lx             EQU   [BP+16]
  390. ly             EQU   [BP+18]
  391. p_x            EQU   [BP+20]
  392. p_y            EQU   [BP+22]
  393. modo           EQU   [BP+24]
  394.  
  395. _PintaBitMap   PROC  FAR
  396.                PUSH  BP
  397.                MOV   BP,SP
  398.                PUSH  SI
  399.                PUSH  DI
  400.                PUSH  DS
  401.                PUSH  ES
  402.                MOV   ES,_segvideo
  403.                LDS   SI,bitmap
  404.  
  405.                MOV   BX,320/4
  406.                CMP   WORD PTR modo,0
  407.                JE    bm_ini_ok
  408.                NEG   BX
  409.                MOV   AX,lx             ; empezar por el final
  410.                DEC   AX
  411.                ADD   p_x,AX
  412.                MOV   AX,ly
  413.                DEC   AX
  414.                ADD   p_y,AX
  415.  
  416. bm_ini_ok:     MOV   AX,rely
  417.                MUL   WORD PTR ancho
  418.                ADD   AX,relx
  419.                ADD   SI,AX             ; DS:SI -> bitmap
  420.  
  421.                MOV   AX,320/4          ; calcular offset en VRAM
  422.                MUL   WORD PTR p_y
  423.                MOV   CX,p_x
  424.                MOV   DI,CX
  425.                SHR   DI,1
  426.            SHR   DI,1
  427.                ADD   DI,AX             ; offset en DI
  428.                AND   CL,3              ; calcular máscara para el
  429.                MOV   AH,00010001b      ; mapa a direccionar en AH
  430.                ROL   AH,CL
  431.                MOV   AL,2              ; a AL el número de registro
  432.                MOV   DX,3C4h
  433.                OUT   DX,AX             ; cargar registro de máscara
  434.  
  435.                MOV   CX,lx
  436. bm_horiz:      PUSH  CX
  437.                PUSH  SI
  438.                PUSH  DI
  439.                PUSH  DS
  440.                MOV   CX,ly
  441. bm_vert:       MOV   AL,[SI]
  442.                MOV   ES:[DI],AL        ; trazar punto
  443.                ADD   DI,BX             ; siguiente scan
  444.                ADD   SI,ancho          ; siguiente punto vertical
  445.                JNC   si_ok1
  446.                PUSH  AX                ; desbordamiento de segmento
  447.                MOV   AX,DS
  448.                ADD   AX,1000h
  449.                MOV   DS,AX
  450.                POP   AX
  451. si_ok1:        LOOP  bm_vert
  452.                POP   DS
  453.                POP   DI
  454.                POP   SI
  455.                INC   SI                ; siguiente punto horizontal
  456.                JNZ   si_ok2
  457.                PUSH  AX                ; desbordamiento de segmento
  458.                MOV   AX,DS
  459.                ADD   AX,1000h
  460.                MOV   DS,AX
  461.                POP   AX
  462. si_ok2:        AND   BX,BX
  463.                JNS   bm_derecho
  464.                ROR   AH,1              ; impresión al revés
  465.                JNC   bm_np
  466.                DEC   DI
  467.                JMP   bm_np
  468. bm_derecho:    ROL   AH,1              ; siguiente mapa de bits
  469.                JNC   bm_np
  470.                INC   DI                ; siguiente dirección VRAM
  471. bm_np:         MOV   AL,2
  472.                OUT   DX,AX
  473.                POP   CX
  474.                LOOP  bm_horiz
  475.  
  476.                POP   ES
  477.                POP   DS
  478.                POP   DI
  479.                POP   SI
  480.                POP   BP
  481.                RET
  482. _PintaBitMap   ENDP
  483.  
  484.  
  485. ; ------------ Establecer el modo 80x30 en la VGA (fuente 8x16).
  486. ;              Declaración: int set80x30 (void);
  487. ;              Devuelve 1 si funciona y 0 si falla (no hay VGA o
  488. ;              no estaba en modo texto de color) además de asignar
  489. ;              en ese caso el nº de líneas a 25 (por si la variable
  490. ;              de la BIOS está indefinida).
  491.  
  492. _set80x30      PROC  FAR
  493.                PUSH  SI
  494.                PUSH  DI
  495.                MOV   AX,1A00h
  496.                INT   10h
  497.                CMP   AL,1Ah
  498.                JNE   set80err      ; no es VGA
  499.                MOV   AH,0Fh
  500.                INT   10h
  501.                CMP   AL,3
  502.                JA    set80err      ; no es modo texto de color
  503.  
  504. set30:         MOV   DX,3D4h       ; Dirección base del CRTC
  505.                CLI
  506.                MOV   AX,00C11h     ; Vertical Display End (desproteger regs. 0-7)
  507.                OUT   DX,AX
  508.                MOV   AX,00D06h     ; Vertical Total
  509.                OUT   DX,AX
  510.                MOV   AX,03E07h     ; Overflow
  511.                OUT   DX,AX
  512.                MOV   AX,0EA10h     ; Vertical Retrace Start
  513.                OUT   DX,AX
  514.                MOV   AX,08C11h     ; Vertical Retrace End (y proteger regs. 0-7)
  515.                OUT   DX,AX
  516.                MOV   AX,0DF12h     ; Vertical Display Enable End
  517.                OUT   DX,AX
  518.                MOV   AX,0E715h     ; Start Vertical Blanking
  519.                OUT   DX,AX
  520.                MOV   AX,00616h     ; End Vertical Blanking
  521.                OUT   DX,AX
  522.                MOV   DX,3CCh       ; Miscellaneous Output
  523.                IN    AL,DX
  524.                AND   AL,00110011b  ; Cambiamos sólo el clock mode a 1
  525.                OR    AL,11000100b  ; y la VSP a negativa.
  526.                MOV   DX,3C2h
  527.                OUT   DX,AL
  528.                STI
  529.                PUSH  DS
  530.                MOV   AX,0040h                  ; área de la BIOS
  531.                MOV   DS,AX
  532.                MOV   WORD PTR DS:[004Ch],8192  ; nuevo tamaño de página en bytes
  533.                MOV   BYTE PTR DS:[0084h],29    ; número de líneas-1
  534.                POP   DS
  535.                MOV   AX,1          ; función con éxito
  536.                POP   DI
  537.                POP   SI
  538.                RET
  539.  
  540. set80err:      PUSH  DS
  541.                MOV   AX,0040h                  ; área de la BIOS
  542.                MOV   DS,AX
  543.                MOV   BYTE PTR DS:[0084h],24    ; número de líneas-1
  544.                POP   DS
  545.                MOV   AX,0          ; función con fallo
  546.                POP   DI
  547.                POP   SI
  548.                RET
  549. _set80x30      ENDP
  550.  
  551.  
  552. ; ------------ Restablecer el modo de vídeo normal.
  553. ;              Declaración:  void ResetVideo (void);
  554.  
  555. _ResetVideo    PROC  FAR
  556.                PUSH  SI
  557.                PUSH  DI
  558.                PUSH  DS
  559.                MOV   DI,40h
  560.                MOV   DS,DI
  561.                MOV   AL,DS:[49h]
  562.                POP   DS
  563.                XOR   AH,AH
  564.                INT   10h                       ; reponer modo en curso
  565.                POP   DI
  566.                POP   SI
  567.                RET
  568. _ResetVideo    ENDP
  569.  
  570.  
  571. ; ------------ Introducir tecla en el buffer del teclado.
  572. ;              Declaración: int ptecla (int tecla);
  573.  
  574. tecla          EQU   [BP+6]            ; para modelo LARGE
  575.  
  576. _ptecla        PROC  FAR
  577.                PUSH  BP
  578.                MOV   BP,SP
  579.                PUSH  DS
  580.                MOV   BX,40h
  581.                MOV   DS,BX
  582.                CLI
  583.                MOV   BX,DS:[1Ch]       ; puntero a la cola del buffer
  584.                MOV   CX,BX
  585.                ADD   CX,2              ; CX -> siguiente dato
  586.                CMP   WORD PTR DS:[82h],0   ; más allá del fin del buffer
  587.                JNE   test_fin
  588.                CMP   CX,3Eh            ; BIOS obsoleta: buffer fijo
  589.                JMP   tested_fin
  590. test_fin:      CMP   CX,DS:[82h]
  591. tested_fin:    JB    no_desb
  592.                MOV   CX,DS:[80h]       ; inicio de la cola circular
  593.                AND   CX,CX
  594.                JNZ   no_desb
  595.                MOV   CX,1Eh            ; BIOS obsoleta: buffer fijo
  596. no_desb:       CMP   CX,DS:[1Ah]       ; puntero al inicio del buffer
  597.                MOV   AX,1              ; condición de buffer lleno
  598.                JE    fin_ptec
  599.                MOV   AX,tecla
  600.                MOV   DS:[BX],AX        ; introducir carácter
  601.                MOV   DS:[1Ch],CX       ; actualizar puntero al final
  602.                MOV   AX,0              ; condición de buffer no lleno
  603. fin_ptec:      STI
  604.                POP   DS
  605.                POP   BP
  606.                RET
  607. _ptecla        ENDP
  608.  
  609.  
  610. ; ------------ Obtener número aleatorio rápido.
  611. ;              Declaración: unsigned rnd (int unsigned);
  612.  
  613. rango          EQU   [BP+6]            ; para modelo LARGE
  614.  
  615. _rnd           PROC  FAR
  616.                PUSH  BP
  617.                MOV   BP,SP
  618.                CMP   _semilla,0
  619.                JNE   dev_rnd
  620.                PUSH  DS
  621.                MOV   AX,40h
  622.                MOV   DS,AX
  623.                MOV   AX,DS:[6Ch]       ; contador hora BIOS
  624.                POP   DS                ; como semilla
  625.                MOV   _semilla,AX
  626. dev_rnd:       MOV   AX,_semilla
  627.                MOV   BX,AX
  628.                MOV   CL,7
  629.                SHR   AX,CL
  630.                XOR   AX,BX
  631.                AND   AX,1
  632.                ROR   AX,1
  633.                SHR   BX,1
  634.                OR    AX,BX
  635.                MOV   _semilla,AX
  636.                MUL   WORD PTR rango
  637.                MOV   AX,DX
  638.                POP   BP
  639.                RET
  640. _rnd           ENDP
  641.  
  642.  
  643. ; ------------ Esperar que el contador del DMA alcance el final y
  644. ;              resetear la controladora de disquetes.
  645.  
  646. unidad         EQU   BYTE PTR [BP+6]   ; para modelo LARGE
  647.  
  648. _EsperaDma0    PROC  FAR
  649.                CLI                     ; *
  650.                PUSH  AX
  651.                PUSH  BX
  652.                PUSH  CX
  653.                PUSH  DX
  654.  
  655.                IN    AL,61h
  656.                AND   AL,11111100b
  657.                OR    AL,1
  658.                JMP   SHORT $+2
  659.                OUT   61h,AL            ; cnt2 en marcha
  660.                MOV   AL,10010110b
  661.                JMP   SHORT $+2
  662.                OUT   43h,AL            ; 8254: cnt2 byte bajo
  663.                MOV   AL,0
  664.                JMP   SHORT $+2
  665.                OUT   42h,AL
  666.                MOV   AL,10100110b
  667.                JMP   SHORT $+2
  668.                OUT   43h,AL            ; 8254: cnt2 byte alto
  669.                MOV   AL,0
  670.                JMP   SHORT $+2
  671.                OUT   42h,AL
  672.  
  673.                JMP   SHORT $+2
  674.                IN    AL,42h
  675.                MOV   BL,AL             ; estado de la cuenta alta
  676.                MOV   DX,3F4h
  677.                MOV   CX,9321           ; cte. para dos segundos
  678.  
  679. wait_dma:      IN    AL,DX             ; transferencia con DMA
  680.                XOR   AL,11000000b
  681.                TEST  AL,11000000b
  682.                JZ    dma_fin           ; hay resultados del FDC
  683.                IN    AL,5
  684.                MOV   AH,AL
  685.                IN    AL,5              ; contador del canal 2
  686.                CMP   AX,-1
  687.                JE    dma_fin           ; fin de la cuenta del DMA
  688.                IN    AL,42h
  689.                CMP   AL,BL
  690.                JE    wait_dma          ; no han pasado 256/1193180 seg
  691.                MOV   BL,AL
  692.                LOOP  wait_dma
  693.  
  694. dma_fin:       MOV   CL,unidad
  695.                ADD   CL,4
  696.                MOV   AL,1
  697.                SHL   AL,CL             ; bits motor en nibble alto
  698.                OR    AL,unidad         ; seleccionar unidad
  699.                OR    AL,00001000b      ; interrupciones+DMA y reset
  700.                MOV   DX,3F2h           ; registro de salida digital
  701.                OUT   DX,AL             ; señal de reset
  702.                STI                     ; *
  703.                XOR   CX,CX
  704. pp486:         JMP   SHORT $+2
  705.                LOOP  pp486
  706.                OR    AL,00000100b
  707.                OUT   DX,AL             ; fin de señal de reset
  708.                POP   DX
  709.                POP   CX
  710.                POP   BX
  711.                POP   AX
  712.                RET
  713. _EsperaDma0    ENDP
  714.  
  715.  
  716. ; ------------ Comprobar si es 386 o superior.
  717. ;              Declaración: int es386 (void);
  718.  
  719. _es386         PROC  FAR
  720.                PUSHF
  721.                POP   AX
  722.                OR    AH,70h        ; intentar activar bit 12, 13 ó 14
  723.                PUSH  AX            ; del registro de estado
  724.                POPF
  725.                PUSHF
  726.                POP   AX
  727.                AND   AH,0F0h
  728.                CMP   AH,0F0h
  729.                MOV   AL,0
  730.                JE    fin_test_CPU  ; es 8086 o similar
  731.                AND   AH,70h        ; 286 pone bits 12, 13 y 14 a cero
  732.                JZ    fin_test_CPU  ; es 286
  733.                MOV   AL,1          ; 386 o superior
  734. fin_test_CPU:  MOV   AH,0
  735.                RET
  736. _es386         ENDP
  737.  
  738.  
  739. ; ------------ Gestor de errores críticos para mejorar presentación.
  740.  
  741. _NuevaInt24    PROC
  742.                MOV   AL,3      ; error en la función DOS invocada.
  743.                IRET
  744. _NuevaInt24    ENDP
  745.  
  746.  
  747. ; ------------ Devolver «hora» exacta.
  748. ;              Declaración: unsigned long tiempo (void);
  749.  
  750. _tiempo        PROC  FAR
  751.                CLI
  752.                MOV   AL,6
  753.                OUT   43h,AL       ; enclavamiento contador 0
  754.                IN    AL,40h
  755.                MOV   AH,AL
  756.                IN    AL,40h
  757.                XCHG  AH,AL
  758.                NEG   AX           ; AX = valor del contador 0 del 8254
  759.                PUSH  DS
  760.                MOV   BX,40h
  761.                MOV   DS,BX
  762.                MOV   DX,DS:[6Ch]  ; DX = contador hora BIOS
  763.                STI
  764.                POP   DS
  765.                RET
  766. _tiempo        ENDP
  767.  
  768. _TEXT          ENDS
  769.  
  770.  
  771. _DATA          SEGMENT WORD PUBLIC 'DATA'
  772.  
  773. _segvideo      DW    0A000h            ; puede variar con la página
  774. _semilla       DW    0                 ; para números aleatorios
  775.  
  776.  
  777. ; ------------ Juego de caracteres 8x16 con estilo informático.
  778.  
  779. _FuenteInfo    EQU   THIS BYTE
  780.                DB      0,   0,   0,   0,   0,   0,   0,   0
  781.                DB      0,   0,   0,   0,   0,   0,   0,   0
  782.                DB      0,   0,   0,  60,  66, 129, 165, 129
  783.                DB    189, 153, 129,  66,  60,   0,   0,   0
  784.                DB      0,   0,   0,  60, 126, 255, 219, 255
  785.                DB    195, 231, 255, 126,  60,   0,   0,   0
  786.                DB      0,   0,   0,   0, 108, 254, 254, 254
  787.                DB    254, 124,  56,  16,   0,   0,   0,   0
  788.                DB      0,   0,   0,   0,  16,  56, 124, 254
  789.                DB    124,  56,  16,   0,   0,   0,   0,   0
  790.                DB      0,   0,   0,  24,  60,  24, 102, 255
  791.                DB    102,  24,  24,  60,   0,   0,   0,   0
  792.                DB      0,   0,   0,  24,  60, 126, 255, 255
  793.                DB    126,  24,  24,  60,   0,   0,   0,   0
  794.                DB      0,   0,   0,   0,   0,   0,  24,  60
  795.                DB     60,  24,   0,   0,   0,   0,   0,   0
  796.                DB    255, 255, 255, 255, 255, 255, 231, 195
  797.                DB    195, 231, 255, 255, 255, 255, 255, 255
  798.                DB      0,   0,   0,   0,   0,  60, 102,  66
  799.                DB     66, 102,  60,   0,   0,   0,   0,   0
  800.                DB    255, 255, 255, 255, 255, 195, 153, 189
  801.                DB    189, 153, 195, 255, 255, 255, 255, 255
  802.                DB      0,   0,  30,  14,  26,  50, 120, 204
  803.                DB    204, 204, 204, 120,   0,   0,   0,   0
  804.                DB      0,   0,  60, 102, 102, 102, 102,  60
  805.                DB     24, 126,  24,  24,   0,   0,   0,   0
  806.                DB      0,   0,   0,  62,  51,  62,  51,  48
  807.                DB     48, 112, 240, 224,   0,   0,   0,   0
  808.                DB      0,   0,   0,  63,  51,  63,  51,  51
  809.                DB     51, 119, 255, 238,   0,   0,   0,   0
  810.                DB      0,   0,  24,  24,  24, 219,  60, 231
  811.                DB     60, 219,  24,  24,  24,   0,   0,   0
  812.                DB      0, 128, 192, 224, 240, 248, 254, 248
  813.                DB    240, 224, 192, 128,   0,   0,   0,   0
  814.                DB      0,   2,   6,  14,  30,  62, 254,  62
  815.                DB     30,  14,   6,   2,   0,   0,   0,   0
  816.                DB      0,   0,  24,  60, 126,  24,  24,  24
  817.                DB    126,  60,  24,   0,   0,   0,   0,   0
  818.                DB      0,   0, 102, 102, 102, 102, 102, 102
  819.                DB    102,   0, 102, 102,   0,   0,   0,   0
  820.                DB      0,   0, 127, 219, 219, 219, 123,  27
  821.                DB     27,  27,  27,  27,   0,   0,   0,   0
  822.                DB      0, 124, 198,  96,  56, 108, 198, 198
  823.                DB    108,  56,  12, 198, 124,   0,   0,   0
  824.                DB      0,   0,   0,   0,   0,   0,   0,   0
  825.                DB    254, 254, 254, 254,   0,   0,   0,   0
  826.                DB      0,   0,  24,  60, 126,  24,  24,  24
  827.                DB    126,  60,  24, 126,   0,   0,   0,   0
  828.                DB      0,   0,  24,  60, 126,  24,  24,  24
  829.                DB     24,  24,  24,  24,   0,   0,   0,   0
  830.                DB      0,   0,  24,  24,  24,  24,  24,  24
  831.                DB     24, 126,  60,  24,   0,   0,   0,   0
  832.                DB      0,   0,   0,   0,   0,  24,  12, 254
  833.                DB     12,  24,   0,   0,   0,   0,   0,   0
  834.                DB      0,   0,   0,   0,   0,  48,  96, 254
  835.                DB     96,  48,   0,   0,   0,   0,   0,   0
  836.                DB      0,   0,   0,   0,   0,   0, 192, 192
  837.                DB    192, 254,   0,   0,   0,   0,   0,   0
  838.                DB      0,   0,   0,   0,   0,  36, 102, 255
  839.                DB    102,  36,   0,   0,   0,   0,   0,   0
  840.                DB      0,   0,   0,  16,  16,  16,  16,  56
  841.                DB     56,  56, 124, 124, 124, 254, 254,   0
  842.                DB      0, 254, 254, 124, 124, 124,  56,  56
  843.                DB     56,  16,  16,  16,  16,   0,   0,   0
  844.                DB      0,   0,   0,   0,   0,   0,   0,   0
  845.                DB      0,   0,   0,   0,   0,   0,   0,   0
  846.                DB      0,   0,   0,  48,  48,  48,  48,  56
  847.                DB     56,  56,   0,  56,   0,   0,   0,   0
  848.                DB      0,   0,   0, 238, 238,  34,  34,   0
  849.                DB      0,   0,   0,   0,   0,   0,   0,   0
  850.                DB      0,   0,   0,  36,  36, 126,  36,  36
  851.                DB    126,  36,  36,   0,   0,   0,   0,   0
  852.                DB      0,   0,   0,  24, 126,  98,  96, 126
  853.                DB     14,  78, 126,  24,   0,   0,   0,   0
  854.                DB      0,   0,   0, 226, 226,   2,   2, 254
  855.                DB    224, 224, 238, 238,   0,   0,   0,   0
  856.                DB      0,   0,   0, 120,  96, 100, 254, 228
  857.                DB    228, 228, 228, 252,   0,   0,   0,   0
  858.                DB      0,   0,   0,  56,  56,   8,   0,   0
  859.                DB      0,   0,   0,   0,   0,   0,   0,   0
  860.                DB      0,   0,  14,  24,  24,  24,  24,  28
  861.                DB     28,  28,  28,  28,  14,   0,   0,   0
  862.                DB      0,   0, 112,  24,  24,  24,  24,  56
  863.                DB     56,  56,  56,  56, 112,   0,   0,   0
  864.                DB      0,   0,   0,   0,   0, 214, 214, 124
  865.                DB    214, 214,   0,   0,   0,   0,   0,   0
  866.                DB      0,   0,   0,   0,   0,   0,  24,  24
  867.                DB    126,  24,  24,   0,   0,   0,   0,   0
  868.                DB      0,   0,   0,   0,   0,   0,   0,   0
  869.                DB      0,   0,  56,  56,   8,   8,   0,   0
  870.                DB      0,   0,   0,   0,   0,   0,   0,   0
  871.                DB    126,   0,   0,   0,   0,   0,   0,   0
  872.                DB      0,   0,   0,   0,   0,   0,   0,   0
  873.                DB      0,   0,  56,  56,   0,   0,   0,   0
  874. ;               DB      0,   0,   0,   2,   2,   2,   2, 254  ; / orig.
  875. ;               DB    224, 224, 224, 224,   0,   0,   0,   0
  876.                DB      0,   0,   0,   0,   2,   6,  12,  24   ; / modif.
  877.                DB     48,  96,  64,   0,   0,   0,   0,   0
  878.                DB      0,   0,   0, 254, 134, 134, 142, 142
  879.                DB    142, 142, 142, 254,   0,   0,   0,   0
  880.                DB      0,   0,   0,  24,  24,  24,  56,  56
  881.                DB     56,  56,  56,  56,   0,   0,   0,   0
  882.                DB      0,   0,   0, 254, 134,   6,   6,   6
  883.                DB    254, 224, 226, 254,   0,   0,   0,   0
  884.                DB      0,   0,   0, 252, 140,  12,  14,  62
  885.                DB     14,  14, 142, 254,   0,   0,   0,   0
  886.                DB      0,   0,   0, 140, 140, 140, 140, 140
  887.                DB    254,  28,  28,  28,   0,   0,   0,   0
  888.                DB      0,   0,   0, 254, 192, 192, 254,  14
  889.                DB     14,  14, 142, 254,   0,   0,   0,   0
  890.                DB      0,   0,   0, 254, 134, 128, 254, 142
  891.                DB    142, 142, 142, 254,   0,   0,   0,   0
  892.                DB      0,   0,   0, 254, 134,   6,  14,  14
  893.                DB     14,  14,  14,  14,   0,   0,   0,   0
  894.                DB      0,   0,   0, 124,  76,  76, 254, 142
  895.                DB    142, 142, 142, 254,   0,   0,   0,   0
  896.                DB      0,   0,   0, 254, 134, 134, 134, 134
  897.                DB    254,  14,  14,  14,   0,   0,   0,   0
  898.                DB      0,   0,   0,   0,   0,   0,  56,  56
  899.                DB      0,   0,  56,  56,   0,   0,   0,   0
  900.                DB      0,   0,   0,   0,   0,   0,  56,  56
  901.                DB      0,   0,  56,  56,   8,   8,   0,   0
  902.                DB      0,   0,   0,   0,   6,  12,  24,  48
  903.                DB    112,  56,  28,  14,   0,   0,   0,   0
  904.                DB      0,   0,   0,   0,   0,   0, 126, 126
  905.                DB      0, 126, 126,   0,   0,   0,   0,   0
  906.                DB      0,   0,   0,   0,  96,  48,  24,  12
  907.                DB     14,  28,  56, 112,   0,   0,   0,   0
  908.                DB      0,   0,   0, 254, 134,   6, 126, 112
  909.                DB    112,   0, 112, 112,   0,   0,   0,   0
  910.                DB      0,   0,   0, 254, 130, 186, 170, 170
  911.                DB    190, 128, 254,   0,   0,   0,   0,   0
  912.                DB      0,   0,   0, 124, 100, 100, 254, 226
  913.                DB    226, 226, 226, 226,   0,   0,   0,   0
  914.                DB      0,   0,   0, 252, 196, 196, 254, 226
  915.                DB    226, 226, 226, 254,   0,   0,   0,   0
  916.                DB      0,   0,   0, 254, 194, 192, 192, 224
  917.                DB    224, 224, 226, 254,   0,   0,   0,   0
  918.                DB      0,   0,   0, 254, 194, 194, 226, 226
  919.                DB    226, 226, 226, 254,   0,   0,   0,   0
  920.                DB      0,   0,   0, 254, 192, 192, 192, 254
  921.                DB    224, 224, 224, 254,   0,   0,   0,   0
  922.                DB      0,   0,   0, 254, 192, 192, 192, 248
  923.                DB    224, 224, 224, 224,   0,   0,   0,   0
  924.                DB      0,   0,   0, 254, 194, 192, 192, 238
  925.                DB    226, 226, 226, 254,   0,   0,   0,   0
  926.                DB      0,   0,   0, 194, 194, 194, 194, 254
  927.                DB    226, 226, 226, 226,   0,   0,   0,   0
  928.                DB      0,   0,   0,  48,  48,  48,  48,  56
  929.                DB     56,  56,  56,  56,   0,   0,   0,   0
  930.                DB      0,   0,   0,  12,  12,  12,  14,  14
  931.                DB     14, 142, 142, 254,   0,   0,   0,   0
  932.                DB      0,   0,   0, 196, 196, 196, 254, 226
  933.                DB    226, 226, 226, 226,   0,   0,   0,   0
  934.                DB      0,   0,   0, 192, 192, 192, 224, 224
  935.                DB    224, 224, 224, 254,   0,   0,   0,   0
  936. ;               DB      0,   0,   0, 238, 214, 214, 214, 214  ; M orig.
  937. ;               DB    230, 230, 230, 226,   0,   0,   0,   0
  938.                DB      0,   0,   0, 198, 238, 254, 254, 214   ; M modif.
  939.                DB    198, 198, 198, 198,   0,   0,   0,   0
  940.                DB      0,   0,   0, 254, 194, 194, 226, 226
  941.                DB    226, 226, 226, 226,   0,   0,   0,   0
  942.                DB      0,   0,   0, 254, 142, 134, 134, 134
  943.                DB    134, 134, 134, 254,   0,   0,   0,   0
  944.                DB      0,   0,   0, 254, 194, 194, 254, 224
  945.                DB    224, 224, 224, 224,   0,   0,   0,   0
  946.                DB      0,   0,   0, 254, 134, 134, 134, 134
  947.                DB    134, 158, 158, 254,   0,   0,   0,   0
  948.                DB      0,   0,   0, 252, 196, 196, 254, 226
  949.                DB    226, 226, 226, 226,   0,   0,   0,   0
  950.                DB      0,   0,   0, 254, 194, 192, 254,  14
  951.                DB     14,  14, 142, 254,   0,   0,   0,   0
  952.                DB      0,   0,   0, 254,  48,  48,  56,  56
  953.                DB     56,  56,  56,  56,   0,   0,   0,   0
  954.                DB      0,   0,   0, 194, 194, 194, 226, 226
  955.                DB    226, 226, 226, 254,   0,   0,   0,   0
  956.                DB      0,   0,   0, 226, 226, 226, 226, 226
  957.                DB    226, 102, 100, 124,   0,   0,   0,   0
  958. ;               DB      0,   0,   0, 230, 230, 230, 214, 214  ; W orig.
  959. ;               DB    214, 214, 214, 238,   0,   0,   0,   0
  960.                DB      0,   0,   0, 198, 198, 198, 214, 214   ; W modif.
  961.                DB    214, 214, 214, 238,   0,   0,   0,   0
  962.                DB      0,   0,   0, 194, 194, 194, 124, 226
  963.                DB    226, 226, 226, 226,   0,   0,   0,   0
  964.                DB      0,   0,   0, 130, 130, 130, 254,  56
  965.                DB     56,  56,  56,  56,   0,   0,   0,   0
  966.                DB      0,   0,   0, 254, 134,   6, 254, 224
  967.                DB    224, 224, 226, 254,   0,   0,   0,   0
  968.                DB      0,   0,  14,   8,   8,   8,   8,   8
  969.                DB      8,   8,   8,   8,  14,   0,   0,   0
  970.                DB      0,   0,   0, 128, 128, 128, 128, 254
  971.                DB     14,  14,  14,  14,   0,   0,   0,   0
  972.                DB      0,   0, 112,  16,  16,  16,  16,  16
  973.                DB     16,  16,  16,  16, 112,   0,   0,   0
  974.                DB      0,   0,  60,  36,  36,   0,   0,   0
  975.                DB      0,   0,   0,   0,   0,   0,   0,   0
  976.                DB      0,   0,   0,   0,   0,   0,   0,   0
  977.                DB      0,   0,   0,   0,   0, 255,   0,   0
  978.                DB      0,   0,  32,  56,  56,   0,   0,   0
  979.                DB      0,   0,   0,   0,   0,   0,   0,   0
  980.                DB      0,   0,   0,   0,   0, 124,  68,   4
  981.                DB    126, 102, 102, 126,   0,   0,   0,   0
  982.                DB      0,   0,   0,  96,  96, 126,  98,  98
  983.                DB     98, 114, 114, 126,   0,   0,   0,   0
  984.                DB      0,   0,   0,   0,   0, 126,  98,  96
  985.                DB    112, 112, 114, 126,   0,   0,   0,   0
  986.                DB      0,   0,   0,   6,   6, 126,  70,  70
  987.                DB     78,  78,  78, 126,   0,   0,   0,   0
  988.                DB      0,   0,   0,   0,   0, 126,  98,  98
  989.                DB    126, 112, 114, 126,   0,   0,   0,   0
  990.                DB      0,   0,   0,  28,  16,  60,  24,  24
  991.                DB     28,  28,  28,  28,   0,   0,   0,   0
  992.                DB      0,   0,   0,   0,   0, 126,  98,  98
  993.                DB    114, 114, 114, 126,   2,   2, 126,   0
  994.                DB      0,   0,   0,  96,  96, 126,  98,  98
  995.                DB    114, 114, 114, 114,   0,   0,   0,   0
  996.                DB      0,   0,   0,  24,  24,   0,  16,  16
  997.                DB     24,  24,  24,  24,   0,   0,   0,   0
  998.                DB      0,   0,   0,  24,  24,   0,  16,  16
  999.                DB     24,  24,  24,  24,   8,   8,  24,   0
  1000.                DB      0,   0,   0,  96,  96, 100, 100, 100
  1001.                DB    126, 114, 114, 114,   0,   0,   0,   0
  1002.                DB      0,   0,   0,  48,  48,  48,  48,  48
  1003.                DB     56,  56,  56,  56,   0,   0,   0,   0
  1004.                DB      0,   0,   0,   0,   0, 254, 146, 146
  1005.                DB    218, 218, 218, 218,   0,   0,   0,   0
  1006.                DB      0,   0,   0,   0,   0, 126,  98,  98
  1007.                DB    114, 114, 114, 114,   0,   0,   0,   0
  1008.                DB      0,   0,   0,   0,   0, 126,  98,  98
  1009.                DB    114, 114, 114, 126,   0,   0,   0,   0
  1010.                DB      0,   0,   0,   0,   0, 126,  98,  98
  1011.                DB    114, 114, 114, 126,  64,  64,  64,   0
  1012.                DB      0,   0,   0,   0,   0, 126,  98,  98
  1013.                DB    114, 114, 114, 126,   2,   2,   2,   0
  1014.                DB      0,   0,   0,   0,   0, 126,  96,  96
  1015.                DB    112, 112, 112, 112,   0,   0,   0,   0
  1016.                DB      0,   0,   0,   0,   0, 126,  98,  96
  1017.                DB    126,  14,  78, 126,   0,   0,   0,   0
  1018.                DB      0,   0,   0,  16,  16,  60,  24,  24
  1019.                DB     28,  28,  28,  28,   0,   0,   0,   0
  1020.                DB      0,   0,   0,   0,   0,  98,  98,  98
  1021.                DB    114, 114, 114, 126,   0,   0,   0,   0
  1022.                DB      0,   0,   0,   0,   0, 114, 114, 114
  1023.                DB    114,  54,  52,  60,   0,   0,   0,   0
  1024.                DB      0,   0,   0,   0,   0, 146, 146, 146
  1025.                DB    218, 218, 218, 238,   0,   0,   0,   0
  1026.                DB      0,   0,   0,   0,   0,  98,  98,  98
  1027.                DB     60, 114, 114, 114,   0,   0,   0,   0
  1028.                DB      0,   0,   0,   0,   0, 114, 114, 114
  1029.                DB    114,  98,  98, 126,   2,   2, 126,   0
  1030.                DB      0,   0,   0,   0,   0, 126,  70,   6
  1031.                DB    126, 112, 114, 126,   0,   0,   0,   0
  1032.                DB      0,   0,  30,  24,  24,  12,   8,  48
  1033.                DB      8,  12,  24,  24,  30,   0,   0,   0
  1034.                DB      0,   0,  24,  24,  24,  24,  24,   0
  1035.                DB     24,  24,  24,  24,  24,   0,   0,   0
  1036.                DB      0,   0, 120,  24,  24,  48,  16,  12
  1037.                DB     16,  48,  24,  24, 120,   0,   0,   0
  1038.                DB      0,   0,   0,   0,   0, 118, 220,   0
  1039.                DB      0,   0,   0,   0,   0,   0,   0,   0
  1040.                DB      0,   0,   0,   0,   0,  16,  56, 108
  1041.                DB    198, 198, 254,   0,   0,   0,   0,   0
  1042.                DB      0,   0,   0, 254, 194, 192, 192, 224
  1043.                DB    224, 224, 226, 254,   8,  14,  98, 126
  1044.                DB      0,   0, 102,   0,   0,  98,  98,  98
  1045.                DB    114, 114, 114, 126,   0,   0,   0,   0
  1046.                DB      0,  12,   8,  16,   0, 126,  98,  98
  1047.                DB    126, 112, 114, 126,   0,   0,   0,   0
  1048.                DB      0,  16,  56, 100,   0, 124,  68,   4
  1049.                DB    126, 102, 102, 126,   0,   0,   0,   0
  1050.                DB      0,   0, 102,   0,   0, 124,  68,   4
  1051.                DB    126, 102, 102, 126,   0,   0,   0,   0
  1052.                DB      0,  48,  16,   8,   0, 124,  68,   4
  1053.                DB    126, 102, 102, 126,   0,   0,   0,   0
  1054.                DB      0, 124, 100, 124,   0, 124,  68,   4
  1055.                DB    126, 102, 102, 126,   0,   0,   0,   0
  1056.                DB      0,   0,   0,   0,   0, 126,  98,  96
  1057.                DB    112, 112, 114, 126,   8,  14,  98, 126
  1058.                DB      0,  16,  56, 100,   0, 126,  98,  98
  1059.                DB    126, 112, 114, 126,   0,   0,   0,   0
  1060.                DB      0,   0, 102,   0,   0, 126,  98,  98
  1061.                DB    126, 112, 114, 126,   0,   0,   0,   0
  1062.                DB      0,  48,  16,   8,   0, 126,  98,  98
  1063.                DB    126, 112, 114, 126,   0,   0,   0,   0
  1064.                DB      0,   0, 102,   0,   0,   0,  16,  16
  1065.                DB     24,  24,  24,  24,   0,   0,   0,   0
  1066.                DB      0,  16,  56, 100,   0,   0,  16,  16
  1067.                DB     24,  24,  24,  24,   0,   0,   0,   0
  1068.                DB      0,  48,  16,   8,   0,   0,  16,  16
  1069.                DB     24,  24,  24,  24,   0,   0,   0,   0
  1070.                DB      0, 204,   0, 124, 100, 100, 254, 226
  1071.                DB    226, 226, 226, 226,   0,   0,   0,   0
  1072.                DB    124, 100, 124,   0, 124, 100, 100, 254
  1073.                DB    226, 226, 226, 226,   0,   0,   0,   0
  1074.                DB     12,   8,  16, 254, 192, 192, 192, 254
  1075.                DB    224, 224, 224, 254,   0,   0,   0,   0
  1076.                DB      0,   0,   0,   0,   0, 255, 153,  25
  1077.                DB    255, 220, 221, 255,   0,   0,   0,   0
  1078.                DB      0,   0,   0, 127,  72,  72, 252, 207
  1079.                DB    204, 204, 204, 207,   0,   0,   0,   0
  1080.                DB      0,  16,  56, 100,   0, 126,  98,  98
  1081.                DB    114, 114, 114, 126,   0,   0,   0,   0
  1082.                DB      0,   0, 102,   0,   0, 126,  98,  98
  1083.                DB    114, 114, 114, 126,   0,   0,   0,   0
  1084.                DB      0,  48,  16,   8,   0, 126,  98,  98
  1085.                DB    114, 114, 114, 126,   0,   0,   0,   0
  1086.                DB      0,  16,  56, 100,   0,  98,  98,  98
  1087.                DB    114, 114, 114, 126,   0,   0,   0,   0
  1088.                DB      0,  48,  16,   8,   0,  98,  98,  98
  1089.                DB    114, 114, 114, 126,   0,   0,   0,   0
  1090.                DB      0,   0, 102,   0,   0, 114, 114, 114
  1091.                DB    114,  98,  98, 126,   2,   2, 126,   0
  1092.                DB      0, 204,   0, 254, 142, 134, 134, 134
  1093.                DB    134, 134, 134, 254,   0,   0,   0,   0
  1094.                DB      0, 102,   0, 194, 194, 194, 226, 226
  1095.                DB    226, 226, 226, 254,   0,   0,   0,   0
  1096.                DB      0,   0,  24,  24,  24, 126,  98, 112
  1097.                DB    114, 126,  24,  24,  24,   0,   0,   0
  1098.                DB      0,   0,   0,  28,  54,  48,  48, 124
  1099.                DB     48,  48, 102, 252,   0,   0,   0,   0
  1100.                DB      0,   0,   0, 102, 102,  60,  24, 126
  1101.                DB     24, 126,  24,  24,   0,   0,   0,   0
  1102.                DB      0,   0,   0, 252, 196, 196, 252, 228
  1103.                DB    238, 228, 230, 230,   0,   0,   0,   0
  1104.                DB      0,  14,  27,  24,  24,  24,  24, 126
  1105.                DB     24,  24,  24,  24,  24, 216, 112,   0
  1106.                DB      0,  12,   8,  16,   0, 124,  68,   4
  1107.                DB    126, 102, 102, 126,   0,   0,   0,   0
  1108.                DB      0,  12,   8,  16,   0,   0,  16,  16
  1109.                DB     24,  24,  24,  24,   0,   0,   0,   0
  1110.                DB      0,  12,   8,  16,   0, 126,  98,  98
  1111.                DB    114, 114, 114, 126,   0,   0,   0,   0
  1112.                DB      0,  12,   8,  16,   0,  98,  98,  98
  1113.                DB    114, 114, 114, 126,   0,   0,   0,   0
  1114.                DB      0,   0, 118, 220,   0, 126,  98,  98
  1115.                DB    114, 114, 114, 114,   0,   0,   0,   0
  1116.                DB    118, 220,   0, 254, 194, 194, 226, 226
  1117.                DB    226, 226, 226, 226,   0,   0,   0,   0
  1118.                DB      0, 124,  68,   4, 126, 102, 126,   0
  1119.                DB    126,   0,   0,   0,   0,   0,   0,   0
  1120.                DB      0, 126,  98,  98, 114, 114, 126,   0
  1121.                DB    126,   0,   0,   0,   0,   0,   0,   0
  1122.                DB      0,   0,   0,  28,  28,   0,  28,  28
  1123.                DB    252, 192, 194, 254,   0,   0,   0,   0
  1124.                DB      0,   0,   0,   0,   0,   0,   0, 254
  1125.                DB    192, 192, 192,   0,   0,   0,   0,   0
  1126.                DB      0,   0,   0,   0,   0,   0,   0, 254
  1127.                DB      6,   6,   6,   0,   0,   0,   0,   0
  1128.                DB      0,  48,  49, 113, 113, 113,   1, 255
  1129.                DB    224, 239, 227, 239, 236,  15,   0,   0
  1130.                DB      0,  48,  49, 113, 113, 113,   1, 255
  1131.                DB    224, 235, 235, 235, 239,   3,   0,   0
  1132.                DB      0,   0,   0,  56,   0,  56,  56,  56
  1133.                DB     24,  24,  24,  24,   0,   0,   0,   0
  1134.                DB      0,   0,   0,   0,   0,  51, 102, 204
  1135.                DB    102,  51,   0,   0,   0,   0,   0,   0
  1136.                DB      0,   0,   0,   0,   0, 204, 102,  51
  1137.                DB    102, 204,   0,   0,   0,   0,   0,   0
  1138.                DB     68,  17,  68,  17,  68,  17,  68,  17
  1139.                DB     68,  17,  68,  17,  68,  17,  68,  17
  1140.                DB    170,  85, 170,  85, 170,  85, 170,  85
  1141.                DB    170,  85, 170,  85, 170,  85, 170,  85
  1142.                DB    119, 221, 119, 221, 119, 221, 119, 221
  1143.                DB    119, 221, 119, 221, 119, 221, 119, 221
  1144.                DB     24,  24,  24,  24,  24,  24,  24,  24
  1145.                DB     24,  24,  24,  24,  24,  24,  24,  24
  1146.                DB     24,  24,  24,  24,  24,  24,  24, 248
  1147.                DB     24,  24,  24,  24,  24,  24,  24,  24
  1148.                DB     24,  24,  24,  24,  24,  24, 248,  24
  1149.                DB    248,  24,  24,  24,  24,  24,  24,  24
  1150.                DB     54,  54,  54,  54,  54,  54,  54, 246
  1151.                DB     54,  54,  54,  54,  54,  54,  54,  54
  1152.                DB      0,   0,   0,   0,   0,   0,   0, 254
  1153.                DB     54,  54,  54,  54,  54,  54,  54,  54
  1154.                DB      0,   0,   0,   0,   0,   0, 248,  24
  1155.                DB    248,  24,  24,  24,  24,  24,  24,  24
  1156.                DB     54,  54,  54,  54,  54,  54, 246,   6
  1157.                DB    246,  54,  54,  54,  54,  54,  54,  54
  1158.                DB     54,  54,  54,  54,  54,  54,  54,  54
  1159.                DB     54,  54,  54,  54,  54,  54,  54,  54
  1160.                DB      0,   0,   0,   0,   0,   0, 254,   6
  1161.                DB    246,  54,  54,  54,  54,  54,  54,  54
  1162.                DB     54,  54,  54,  54,  54,  54, 246,   6
  1163.                DB    254,   0,   0,   0,   0,   0,   0,   0
  1164.                DB     54,  54,  54,  54,  54,  54,  54, 254
  1165.                DB      0,   0,   0,   0,   0,   0,   0,   0
  1166.                DB     24,  24,  24,  24,  24,  24, 248,  24
  1167.                DB    248,   0,   0,   0,   0,   0,   0,   0
  1168.                DB      0,   0,   0,   0,   0,   0,   0, 248
  1169.                DB     24,  24,  24,  24,  24,  24,  24,  24
  1170.                DB     24,  24,  24,  24,  24,  24,  24,  31
  1171.                DB      0,   0,   0,   0,   0,   0,   0,   0
  1172.                DB     24,  24,  24,  24,  24,  24,  24, 255
  1173.                DB      0,   0,   0,   0,   0,   0,   0,   0
  1174.                DB      0,   0,   0,   0,   0,   0,   0, 255
  1175.                DB     24,  24,  24,  24,  24,  24,  24,  24
  1176.                DB     24,  24,  24,  24,  24,  24,  24,  31
  1177.                DB     24,  24,  24,  24,  24,  24,  24,  24
  1178.                DB      0,   0,   0,   0,   0,   0,   0, 255
  1179.                DB      0,   0,   0,   0,   0,   0,   0,   0
  1180.                DB     24,  24,  24,  24,  24,  24,  24, 255
  1181.                DB     24,  24,  24,  24,  24,  24,  24,  24
  1182.                DB     24,  24,  24,  24,  24,  24,  31,  24
  1183.                DB     31,  24,  24,  24,  24,  24,  24,  24
  1184.                DB     54,  54,  54,  54,  54,  54,  54,  55
  1185.                DB     54,  54,  54,  54,  54,  54,  54,  54
  1186.                DB     54,  54,  54,  54,  54,  54,  55,  48
  1187.                DB     63,   0,   0,   0,   0,   0,   0,   0
  1188.                DB      0,   0,   0,   0,   0,   0,  63,  48
  1189.                DB     55,  54,  54,  54,  54,  54,  54,  54
  1190.                DB     54,  54,  54,  54,  54,  54, 247,   0
  1191.                DB    255,   0,   0,   0,   0,   0,   0,   0
  1192.                DB      0,   0,   0,   0,   0,   0, 255,   0
  1193.                DB    247,  54,  54,  54,  54,  54,  54,  54
  1194.                DB     54,  54,  54,  54,  54,  54,  55,  48
  1195.                DB     55,  54,  54,  54,  54,  54,  54,  54
  1196.                DB      0,   0,   0,   0,   0,   0, 255,   0
  1197.                DB    255,   0,   0,   0,   0,   0,   0,   0
  1198.                DB     54,  54,  54,  54,  54,  54, 247,   0
  1199.                DB    247,  54,  54,  54,  54,  54,  54,  54
  1200.                DB     24,  24,  24,  24,  24,  24, 255,   0
  1201.                DB    255,   0,   0,   0,   0,   0,   0,   0
  1202.                DB     54,  54,  54,  54,  54,  54,  54, 255
  1203.                DB      0,   0,   0,   0,   0,   0,   0,   0
  1204.                DB      0,   0,   0,   0,   0,   0, 255,   0
  1205.                DB    255,  24,  24,  24,  24,  24,  24,  24
  1206.                DB      0,   0,   0,   0,   0,   0,   0, 255
  1207.                DB     54,  54,  54,  54,  54,  54,  54,  54
  1208.                DB     54,  54,  54,  54,  54,  54,  54,  63
  1209.                DB      0,   0,   0,   0,   0,   0,   0,   0
  1210.                DB     24,  24,  24,  24,  24,  24,  31,  24
  1211.                DB     31,   0,   0,   0,   0,   0,   0,   0
  1212.                DB      0,   0,   0,   0,   0,   0,  31,  24
  1213.                DB     31,  24,  24,  24,  24,  24,  24,  24
  1214.                DB      0,   0,   0,   0,   0,   0,   0,  63
  1215.                DB     54,  54,  54,  54,  54,  54,  54,  54
  1216.                DB     54,  54,  54,  54,  54,  54,  54, 255
  1217.                DB     54,  54,  54,  54,  54,  54,  54,  54
  1218.                DB     24,  24,  24,  24,  24,  24, 255,  24
  1219.                DB    255,  24,  24,  24,  24,  24,  24,  24
  1220.                DB     24,  24,  24,  24,  24,  24,  24, 248
  1221.                DB      0,   0,   0,   0,   0,   0,   0,   0
  1222.                DB      0,   0,   0,   0,   0,   0,   0,  31
  1223.                DB     24,  24,  24,  24,  24,  24,  24,  24
  1224.                DB    255, 255, 255, 255, 255, 255, 255, 255
  1225.                DB    255, 255, 255, 255, 255, 255, 255, 255
  1226.                DB      0,   0,   0,   0,   0,   0,   0,   0
  1227.                DB    255, 255, 255, 255, 255, 255, 255, 255
  1228.                DB    240, 240, 240, 240, 240, 240, 240, 240
  1229.                DB    240, 240, 240, 240, 240, 240, 240, 240
  1230.                DB     15,  15,  15,  15,  15,  15,  15,  15
  1231.                DB     15,  15,  15,  15,  15,  15,  15,  15
  1232.                DB    255, 255, 255, 255, 255, 255, 255, 255
  1233.                DB      0,   0,   0,   0,   0,   0,   0,   0
  1234.                DB      0,   0,   0,   0,   0,   0, 115, 222
  1235.                DB    204, 204, 222, 115,   0,   0,   0,   0
  1236.                DB      0,   0,   0, 252, 196, 196, 206, 226
  1237.                DB    226, 226, 234, 238, 128, 128, 128,   0
  1238.                DB      0,   0,   0, 126, 102,  96,  96,  96
  1239.                DB     96,  96,  96,  96,   0,   0,   0,   0
  1240.                DB      0,   0,   0,   0,   0, 254, 108, 108
  1241.                DB    108, 108, 108, 108,   0,   0,   0,   0
  1242.                DB      0,   0,   0, 126, 102,  48,  24,  12
  1243.                DB     24,  48, 102, 126,   0,   0,   0,   0
  1244.                DB      0,   0,   0,   0,   0,   0, 126, 216
  1245.                DB    216, 216, 216, 112,   0,   0,   0,   0
  1246.                DB      0,   0,   0,   0,   0, 102, 102, 102
  1247.                DB    102, 124,  96,  96,  96, 192,   0,   0
  1248.                DB      0,   0,   0,   0,   0, 118, 220,  24
  1249.                DB     24,  24,  24,  24,   0,   0,   0,   0
  1250.                DB      0,   0,   0, 126,  24,  60, 102, 102
  1251.                DB    102,  60,  24, 126,   0,   0,   0,   0
  1252.                DB      0,   0,   0,  60, 102, 102, 102, 126
  1253.                DB    102, 102, 102,  60,   0,   0,   0,   0
  1254.                DB      0,   0,   0,   0,   0,  56, 108, 198
  1255.                DB    198, 108, 108, 238,   0,   0,   0,   0
  1256.                DB      0,   0,   0,  30,  48,  24,  12,  62
  1257.                DB    102, 102, 102,  60,   0,   0,   0,   0
  1258.                DB      0,   0,   0,   0,   0,   0, 110, 219
  1259.                DB    219, 118,   0,   0,   0,   0,   0,   0
  1260.                DB      0,   0,   0,   0,   0,  12,  56, 108
  1261.                DB    124, 108,  56,  96,   0,   0,   0,   0
  1262.                DB      0,   0,   0,  28,  48,  96,  96, 120
  1263.                DB     96,  96,  48,  28,   0,   0,   0,   0
  1264.                DB      0,   0,   0,   0,  60, 102, 102, 102
  1265.                DB    102, 102, 102, 102,   0,   0,   0,   0
  1266.                DB      0,   0,   0,   0,   0,   0, 126,   0
  1267.                DB    126,   0, 126,   0,   0,   0,   0,   0
  1268.                DB      0,   0,   0,   0,   0,  24,  24, 126
  1269.                DB     24,  24,   0, 126,   0,   0,   0,   0
  1270.                DB      0,   0,   0,  48,  24,  12,   6,  12
  1271.                DB     24,  48,   0, 126,   0,   0,   0,   0
  1272.                DB      0,   0,   0,  12,  24,  48,  96,  48
  1273.                DB     24,  12,   0, 126,   0,   0,   0,   0
  1274.                DB      0,   0,   0,  14,  27,  27,  24,  24
  1275.                DB     24,  24,  24,  24,  24,  24,  24,  24
  1276.                DB     24,  24,  24,  24,  24,  24,  24,  24
  1277.                DB     24, 216, 216, 112,   0,   0,   0,   0
  1278.                DB      0,   0,   0,   0,   0,  24,   0,   0
  1279.                DB    126,   0,   0,  24,   0,   0,   0,   0
  1280.                DB      0,   0,   0,   0,   0,   0, 118, 220
  1281.                DB      0, 118, 220,   0,   0,   0,   0,   0
  1282.                DB      0,   0,  56, 108, 108,  56,   0,   0
  1283.                DB      0,   0,   0,   0,   0,   0,   0,   0
  1284.                DB      0,   0,   0,   0,   0,   0,   0,  24
  1285.                DB     24,   0,   0,   0,   0,   0,   0,   0
  1286.                DB      0,   0,   0,   0,   0,   0,   0,   0
  1287.                DB     24,   0,   0,   0,   0,   0,   0,   0
  1288.                DB      0,  15,  12,  12,  12,  12,  12, 204
  1289.                DB    108,  60,  28,  12,   0,   0,   0,   0
  1290.                DB      0, 126,  98,  98, 114, 114, 114,   0
  1291.                DB      0,   0,   0,   0,   0,   0,   0,   0
  1292.                DB      0, 126,  70,   6, 126, 112, 126,   0
  1293.                DB      0,   0,   0,   0,   0,   0,   0,   0
  1294.                DB      0,   0,   0,   0,   0,   0,  60,  60
  1295.                DB     60,  60,  60,   0,   0,   0,   0,   0
  1296. ;               DB      0,   0,   0,   0,   0,   0,   0,   0  ; 255 orig.
  1297. ;               DB      0,   0,   0,   0,   0,   0,   0,   0
  1298.                DB      0,   0,   0, 198, 198, 198, 198, 198   ; semi M
  1299.                DB    198, 198, 198, 198,   0,   0,   0,   0
  1300. _DATA          ENDS
  1301.  
  1302.                END
  1303.